Aprenda Ruby em 10 minutos
Ruby é uma linguagem de programação dinâmica e orientada a objetos conhecida por sua sintaxe elegante e recursos amigáveis ao desenvolvedor. Este tutorial aborda os conceitos fundamentais do Ruby para ajudá-lo a aprender a linguagem rapidamente.
1. Escrevendo Seu Primeiro Programa em Ruby
Vamos começar com um programa simples. Crie um arquivo chamado hello.rb
e insira o seguinte código:
puts "Hello, World!"
Salve o arquivo e execute o seguinte comando no terminal:
ruby hello.rb
A saída será:
Hello, World!
Este programa simples demonstra a funcionalidade básica de saída do Ruby. O método puts
é usado para exibir informações de texto no console.
2. Sintaxe Básica
A sintaxe do Ruby é limpa e legível, projetada para ser natural e intuitiva.
# Este é um comentário
puts "Hello, World!"
Regras básicas de sintaxe no Ruby:
- Comentários: Comentários de uma linha começam com
#
, enquanto comentários de várias linhas usam=begin
e=end
. - Declarações: Normalmente uma declaração por linha, não é necessário ponto e vírgula
;
no final. - Blocos de Código: Definidos por
do...end
ou chaves{}
. - Chamadas de Método: Parênteses são opcionais para chamadas de método sem argumentos.
Exemplo com comentários de várias linhas:
=begin
Este é um comentário de várias linhas,
que abrange múltiplas linhas.
=end
3. Variáveis e Tipos de Dados
No Ruby, as variáveis são tipadas dinamicamente e não requerem declarações de tipo explícitas.
Regras básicas de nomenclatura de variáveis:
- Nomes de variáveis podem conter apenas letras, números e sublinhados.
- Nomes de variáveis não podem começar com um número.
- Nomes de variáveis diferenciam maiúsculas de minúsculas.
- Palavras-chave do Ruby não podem ser usadas como nomes de variáveis.
Os principais tipos de dados básicos do Ruby são:
- Inteiro (Integer): por exemplo,
42
ou-10
. - Ponto Flutuante (Float): por exemplo,
3.14
ou2.5e3
. - String (String): por exemplo,
"hello"
ou'world'
, usando aspas simples ou duplas. - Booleano (Boolean):
true
oufalse
. - Nil (Nil): Representado por
nil
, indicando nulo ou sem valor. - Símbolo (Symbol): por exemplo,
:name
, identificadores imutáveis.
3.1 Tipos Numéricos
Ruby suporta inteiros e números de ponto flutuante.
# Inteiro
idade = 25
populacao = 1_000_000 # Sublinhados para legibilidade
# Ponto flutuante
temperatura = 36.5
pi = 3.14159
# Operações
puts 10 + 5 # 15
puts 10 / 3 # 3 (divisão inteira)
puts 10.0 / 3 # 3.333... (divisão de ponto flutuante)
3.2 String
Strings são sequências de caracteres, delimitadas por aspas simples ou duplas.
aspas_simples = 'String com aspas simples'
aspas_duplas = "String com aspas duplas"
multilinha = "Esta é uma
string de múltiplas linhas"
# Interpolação de string (apenas em aspas duplas)
nome = "Alice"
saudacao = "Olá, #{nome}!"
puts saudacao # "Olá, Alice!"
Operações com strings:
texto = "Programação Ruby"
puts texto.length # Comprimento da string
puts texto.upcase # Converter para maiúsculas
puts texto.downcase # Converter para minúsculas
puts texto[0] # Acessar primeiro caractere
puts texto[0..3] # Fatiamento de string
puts texto.include?("Ruby") # Verificar inclusão
3.3 Tipo Booleano
O tipo booleano tem dois valores: true
e false
.
esta_ativo = true
esta_completo = false
# Operações booleanas
resultado1 = true && false # false
resultado2 = true || false # true
resultado3 = !true # false
3.4 Tipo Nil
nil
representa um estado nulo ou sem valor.
valor = nil
if valor.nil?
puts "Valor é nulo"
end
3.5 Símbolo
Símbolos são identificadores imutáveis, frequentemente usados como chaves em hashes.
:name
:email
:created_at
# Símbolos vs Strings
puts :name.object_id == :name.object_id # true (mesmo objeto)
puts "name".object_id == "name".object_id # false (objetos diferentes)
4. Estruturas de Dados
Ruby fornece várias estruturas de dados embutidas para armazenar e manipular dados.
4.1 Array
Um array é uma coleção ordenada que pode conter múltiplos valores.
numeros = [1, 2, 3, 4, 5]
numeros.push(6) # Adicionar elemento
numeros.unshift(0) # Inserir no início
numeros.delete(3) # Remover valor específico
numeros[0] = 10 # Modificar elemento
puts numeros.inspect # [10, 2, 4, 5, 6]
Operações com arrays:
numeros = [10, 20, 30, 40, 50]
puts numeros[1..3] # [20, 30, 40]
puts numeros.first # 10
puts numeros.last # 50
puts numeros.include?(30) # true
4.2 Hash
Um hash é uma coleção de pares chave-valor, semelhante a dicionários em outras linguagens.
estudante = {
name: "John",
age: 20,
major: "Computer Science"
}
# Acessando e modificando hash
puts estudante[:name]
estudante[:age] = 21
estudante[:gpa] = 3.8
# Iterando sobre hash
estudante.each do |chave, valor|
puts "#{chave}: #{valor}"
end
5. Controle de Fluxo
Ruby fornece várias declarações de controle de fluxo para gerenciar a execução do programa.
5.1 Declarações if
A declaração if
avalia uma condição e executa seu bloco se a condição for verdadeira.
idade = 20
if idade >= 18
puts "Adulto"
elsif idade >= 13
puts "Adolescente"
else
puts "Criança"
end
# if em uma linha
puts "Adulto" if idade >= 18
5.2 Declarações unless
unless
é o oposto de if
- executa quando a condição é falsa.
idade = 15
unless idade >= 18
puts "Não é adulto"
end
# unless em uma linha
puts "Não é adulto" unless idade >= 18
5.3 Declarações case
Declarações case
fornecem uma maneira limpa de lidar com múltiplas condições.
nota = "B"
case nota
when "A"
puts "Excelente"
when "B"
puts "Bom"
when "C"
puts "Médio"
else
puts "Precisa melhorar"
end
5.4 Loops
Ruby suporta várias construções de loop.
Loop while:
contador = 0
while contador < 5
puts contador
contador += 1
end
Loop until:
contador = 0
until contador >= 5
puts contador
contador += 1
end
Loop for:
for i in 0..4
puts i
end
Iterador each:
(0..4).each do |i|
puts i
end
# Com arrays
frutas = ["maçã", "banana", "cereja"]
frutas.each do |fruta|
puts fruta
end
break e next:
(0..9).each do |i|
break if i == 5 # Sair do loop
next if i % 2 == 0 # Pular números pares
puts i # Saída: 1, 3
end
6. Métodos
Métodos em Ruby são definidos usando a palavra-chave def
.
Definição Básica de Método:
def saudar(nome)
"Olá, #{nome}!"
end
# Chamando o método
mensagem = saudar("John")
puts mensagem
Parâmetros Padrão:
def saudar(nome, saudacao = "Olá")
"#{saudacao}, #{nome}!"
end
puts saudar("Alice") # "Olá, Alice!"
puts saudar("Bob", "Oi") # "Oi, Bob!"
Argumentos Variáveis:
def somar_numeros(*numeros)
numeros.sum
end
puts somar_numeros(1, 2, 3, 4) # 10
Argumentos de Palavra-Chave:
def criar_pessoa(nome:, idade:, cidade: "Desconhecida")
{ nome: nome, idade: idade, cidade: cidade }
end
pessoa = criar_pessoa(nome: "Alice", idade: 25)
puts pessoa.inspect
7. Blocos e Procs
Blocos são pedaços de código que podem ser passados para métodos.
Usando Blocos:
# Usando do...end
3.times do
puts "Olá!"
end
# Usando chaves
3.times { puts "Olá!" }
# Blocos com parâmetros
(1..3).each do |numero|
puts "Número: #{numero}"
end
Palavra-Chave Yield:
def executar_bloco
puts "Antes do bloco"
yield
puts "Depois do bloco"
end
executar_bloco { puts "Dentro do bloco" }
Procs:
Procs são objetos que encapsulam blocos.
quadrado = Proc.new { |x| x * x }
puts quadrado.call(5) # 25
# Passando procs para métodos
def aplicar_operacao(numeros, operacao)
numeros.map { |n| operacao.call(n) }
end
numeros = [1, 2, 3, 4]
quadrados = aplicar_operacao(numeros, quadrado)
puts quadrados.inspect # [1, 4, 9, 16]
8. Classes e Objetos
Ruby é uma linguagem puramente orientada a objetos onde tudo é um objeto.
Definição Básica de Classe:
class Pessoa
def initialize(nome, idade)
@nome = nome
@idade = idade
end
def apresentar
"Eu sou #{@nome}, #{@idade} anos"
end
def fazer_aniversario
@idade += 1
"#{@nome} fez aniversário, agora tem #{@idade} anos"
end
end
# Criando objetos
pessoa1 = Pessoa.new("John", 25)
pessoa2 = Pessoa.new("Jane", 30)
puts pessoa1.apresentar
puts pessoa2.fazer_aniversario
Métodos Acessores:
class Pessoa
attr_reader :nome # Acesso de leitura
attr_writer :idade # Acesso de escrita
attr_accessor :cidade # Acesso de leitura e escrita
def initialize(nome, idade, cidade)
@nome = nome
@idade = idade
@cidade = cidade
end
end
pessoa = Pessoa.new("Alice", 25, "Nova York")
puts pessoa.nome # "Alice"
pessoa.idade = 26 # Definir idade
pessoa.cidade = "Boston" # Definir cidade
puts pessoa.cidade # "Boston"
Métodos de Classe e Variáveis:
class Estudante
@@contador_estudantes = 0 # Variável de classe
def initialize(nome)
@nome = nome
@@contador_estudantes += 1
end
def self.contador_estudantes # Método de classe
@@contador_estudantes
end
end
estudante1 = Estudante.new("John")
estudante2 = Estudante.new("Jane")
puts Estudante.contador_estudantes # 2
Herança:
class Animal
def initialize(nome)
@nome = nome
end
def falar
"#{@nome} faz um som"
end
end
class Cachorro < Animal
def falar
"#{@nome} late"
end
end
class Gato < Animal
def falar
"#{@nome} mia"
end
end
cachorro = Cachorro.new("Buddy")
gato = Gato.new("Mimi")
puts cachorro.falar # "Buddy late"
puts gato.falar # "Mimi mia"
9. Módulos e Mixins
Módulos são usados para agrupar métodos e constantes relacionados, e podem ser misturados em classes.
Definição de Módulo:
module Falavel
def falar
"#{@nome} diz algo"
end
end
class Pessoa
include Falavel
def initialize(nome)
@nome = nome
end
end
pessoa = Pessoa.new("Alice")
puts pessoa.falar # "Alice diz algo"
Namespacing com Módulos:
module Matematica
PI = 3.14159
def self.quadrado(x)
x * x
end
end
puts Matematica::PI # 3.14159
puts Matematica.quadrado(5) # 25
10. Tratamento de Exceções
Ruby fornece tratamento robusto de exceções usando begin
, rescue
, ensure
e raise
.
Tratamento Básico de Exceções:
begin
resultado = 10 / 0
rescue ZeroDivisionError => e
puts "Não é possível dividir por zero: #{e.message}"
else
puts "Divisão bem-sucedida"
ensure
puts "Isso sempre executa"
end
Lançando Exceções:
def dividir(a, b)
raise "Não é possível dividir por zero" if b == 0
a / b
end
begin
resultado = dividir(10, 0)
rescue => e
puts "Erro: #{e.message}"
end
11. Operações com Arquivos
Ruby fornece métodos simples para ler e escrever arquivos.
Lendo Arquivos:
# Ler arquivo inteiro
conteudo = File.read("exemplo.txt")
puts conteudo
# Ler linha por linha
File.foreach("exemplo.txt") do |linha|
puts linha.chomp
end
Escrevendo Arquivos:
# Escrever no arquivo
File.write("saida.txt", "Olá, Ruby!\n")
# Anexar ao arquivo
File.open("saida.txt", "a") do |arquivo|
arquivo.puts "Anexando novo conteúdo."
end
12. Métodos Úteis Embarcados
Ruby vem com muitos métodos úteis embarcados.
Métodos de String:
texto = " Programação Ruby "
puts texto.strip # Remover espaços em branco
puts texto.split(" ") # Dividir em array
puts texto.gsub("Ruby", "Python") # Substituir
Métodos de Array:
numeros = [3, 1, 4, 1, 5, 9, 2]
puts numeros.sort.inspect # [1, 1, 2, 3, 4, 5, 9]
puts numeros.uniq.inspect # [3, 1, 4, 5, 9, 2]
puts numeros.select { |n| n > 3 }.inspect # [4, 5, 9]
Métodos de Hash:
pessoa = { nome: "Alice", idade: 25, cidade: "Nova York" }
puts pessoa.keys.inspect # [:nome, :idade, :cidade]
puts pessoa.values.inspect # ["Alice", 25, "Nova York"]
puts pessoa.has_key?(:idade) # true
13. Ruby Gems
RubyGems é o gerenciador de pacotes do Ruby para instalar e gerenciar bibliotecas.
Instalando Gems:
gem install rails
Usando Gems no Código:
require 'json'
# Analisar JSON
string_json = '{"name": "Alice", "age": 25}'
pessoa = JSON.parse(string_json)
puts pessoa["name"] # "Alice"
# Gerar JSON
hash_pessoa = { name: "Bob", age: 30 }
saida_json = JSON.generate(hash_pessoa)
puts saida_json # {"name":"Bob","age":30}
14. Guia de Estilo Ruby
Ruby tem um guia de estilo da comunidade forte que promove código limpo e legível.
Indentação: Use 2 espaços para indentação.
Convenções de Nomenclatura:
- Variáveis e métodos:
snake_case
- Classes e módulos:
CamelCase
- Constantes:
SCREAMING_SNAKE_CASE
Parênteses: Use parênteses para chamadas de método com argumentos, omita para chamadas de método sem argumentos.
Blocos: Use do...end
para blocos de múltiplas linhas, {}
para blocos de uma linha.
A sintaxe elegante e os recursos poderosos do Ruby tornam-no um prazer de trabalhar. Seu foco na felicidade e produtividade do desenvolvedor o tornou popular para desenvolvimento web, scripting e tarefas de automação.